package org.example.java_chatroom.component;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author @fiber-cloud
 * @Date 2025/11/6 18:20
 * 通过这个类来记录当前用户在线的状态（维护了 userId 和 WebSocketSession 之间的映射）
 */

@Component
public class OnlineUserManager {
    //此处的哈希表，考虑到线程安全问题，使用ConcurrentHashMap更加靠谱
    private ConcurrentHashMap<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>();

    // 用户上线 ，给这个哈希表中插入键值对
    // 这里要注意避免多开
    public void online(int userId,WebSocketSession session){
        if (sessions.get(userId) != null){
            //此时说明用户已经在线了，就登录失败，不会记录这个映射关系
            // 也就是说，后续收不到任何消息
            System.out.println("[" +userId+ "] 已经被登录了，登录失败！");
            return;
        }
        sessions.put(userId,session);
        System.out.println("[" +userId+ "] 上线！");
    }
    // 用户下线，针对这个哈希表进行删除操作
    public void offline(int userId,WebSocketSession session){
        WebSocketSession existSession = sessions.get(userId);

        if (existSession == session){
            //如果这两个 session 是同一个，才是真正进行下线操作，否则啥也不干
            sessions.remove((userId));
            System.out.println("[" +userId+ "] 下线！");
        }
    }
    // 根据userId 获取到 wbeSocketSession
    public WebSocketSession getSession(int userId){
        return sessions.get(userId);
    }

}
